package com.example.javamaday.graph;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 有向图实现
 */
public class Digraph {

    private final int V; // 记录顶点数量

    private int E; //记录边的数量

    private Queue<Integer>[] adj; // 邻接表

    public Digraph(int v) {
        this.V = v;
        this.E = 0;
        this.adj = new Queue[v];
        for (int i = 0; i < adj.length; i++) {
            adj[i] = new ConcurrentLinkedQueue<>();
        }
    }

    // 获取顶点的数目
    public int V() {
        return V;
    }

    // 获取边的数目
    public int E() {
        return E;
    }

    // 向有向图中添加一条边 v->w
    public void addEdge(int v, int w) {
        // 只需让顶点w出现在v的邻接表，中，因为边是由方向的。
        // 最终，顶点v的临街表中存储的相邻顶点的含义是：v->其他顶点。
        adj[v].add(w);
        E++;
    }

    // 获取由v指出的边所连接的所有顶点
    public Queue<Integer> adj(int v) {
        return adj[v];
    }

    // 该图的反向图
    private Digraph reverse() {
        Digraph reverseDigraph = new Digraph(V);
        for (int v=  0; v < V; v++) {
            for (Integer w : adj[v]) {
                reverseDigraph.addEdge(w, v);
            }
        }
        return reverseDigraph;
    }



}
